﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.Collections; //Bruges til at anvende iteratoren på lister

using Controller; //Vores Controller
using Interfaces; //Vores Interface

namespace GUI
{
    public partial class frmProdukter : Form
    {
        private LagerSystem lagersystem; //Aggregering af lagersystem (controller)

        //Attribut
        private int tilstand;

        //Konstanter
        private const int STARTTILSTAND = 0;
        private const int OPRETTILSTAND = 1;
        private const int REDIGERTILSTAND = 2;
        private const int NORMALTILSTAND = 3;
        
        //Kontruktør
        public frmProdukter(LagerSystem lagersystem)
        {
            InitializeComponent();
            this.lagersystem = lagersystem;
            starttilstand();
            opdaterProduktliste();
        }
        //Metoder
        private void frmProdukter_Load(object sender, EventArgs e)
        {
            IEnumerator<ILeverandørdata> leviterator = lagersystem.GetLeverandøriterator();
            leviterator.Reset();
            while (leviterator.MoveNext())
            {
                ILeverandørdata levdata = (ILeverandørdata)leviterator.Current;
                cboLeverandør.Items.Add(levdata.LeverandørId + ": " + levdata.Navn);
            }
        }

        //Event handlers
        private void lstProdukter_SelectedIndexChanged(object sender, EventArgs e)
        {
            normaltilstand();
            string produktNr = "";

            //Workarround
            //if (lstProdukter.FocusedItem != null)
            if (lstProdukter.SelectedItems.Count>0)
            {
                //produktNr = lstProdukter.FocusedItem.SubItems[0].Text;
                produktNr = lstProdukter.SelectedItems[0].Text;
            }
            else
            {
                return;
            }

            opdaterProduktTextbokse(produktNr);
        }

        private void btnTilbage_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void btnNy_Click(object sender, EventArgs e)
        {
            oprettilstand();
            rydTextbokse();
        }

        private void btnFortryd_Click(object sender, EventArgs e)
        {
            starttilstand();
            rydTextbokse();
        }

        private void btnGem_Click(object sender, EventArgs e)
        {
            string produktNr, betegnelse;
            int beholdning, stkPrPakke, minimumBeholdning, leverandørId;
            double pakkePris;

            produktNr = txtProduktNr.Text;

            if (produktNr == "")
            {
                MessageBox.Show("Der skal være et produkt Id", "Ups!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                txtProduktNr.Focus();
                return;
            }

            try
            {
                betegnelse = txtBetegnelse.Text;
                beholdning = Convert.ToInt32(txtBeholdning.Text);
                stkPrPakke = Convert.ToInt32(txtStkPrPakke.Text);
                minimumBeholdning = Convert.ToInt32(txtMinimumsbeholdning.Text);
                pakkePris = Convert.ToDouble(txtPakkepris.Text);
            }

            catch (FormatException)
            {
                MessageBox.Show("Der er fejlindtastning, typisk fordi der er skrevet" + Environment.NewLine + "bogstaver hvor der skal være et tal", "Ups!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                txtBetegnelse.Focus();
                return;
            }

            if (beholdning < 0 || stkPrPakke < 0 || minimumBeholdning < 0 || pakkePris < 0)
            {
                MessageBox.Show("Negative tal accepteres ikke", "Ups!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                txtBeholdning.Focus();
                return;
            }

            if (cboLeverandør.SelectedIndex < 0)
            {
                MessageBox.Show("Der er ikke valgt en leverandør", "Hovsa", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                cboLeverandør.Focus();
                return;
            }

            else
            {
                string[] leverandørarray;
                string leverandør;
                leverandør = cboLeverandør.Text;
                leverandørarray = leverandør.Split(':');            
                leverandørId = Convert.ToInt32(leverandørarray[0]);
            }

            if (tilstand == OPRETTILSTAND)
            {
                try
                {
                    lagersystem.OpretProdukt(leverandørId, produktNr, betegnelse, stkPrPakke, beholdning, minimumBeholdning, pakkePris);
                }
                catch (Exception)
                {
                    MessageBox.Show("Der findes allerede et produkt med den stregkode.", "Fordømt!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }

            }
            else
            {
                lagersystem.RedigerProdukt(produktNr, betegnelse, stkPrPakke, beholdning, minimumBeholdning, pakkePris, leverandørId);
            }
           
            opdaterProduktliste();
            normaltilstand();
        }

        private void btnFind_Click(object sender, EventArgs e)
        {
            string produktNr = txtScan1.Text;
  
            for (int i = 0; i < lstProdukter.Items.Count; i++)
            {
                if (lstProdukter.Items[i].Text == produktNr)
                {
                    lstProdukter.Focus();
                    lstProdukter.FocusedItem = lstProdukter.Items[i];
                    lstProdukter.FocusedItem.Selected = true;
                    txtScan1.Clear();
   
                    return;
                }
            }

            MessageBox.Show("Produkt ikke fundet");
            txtScan1.Clear();
            lstProdukter.Focus();
            lstProdukter.FocusedItem = lstProdukter.Items[0];
            lstProdukter.FocusedItem.Selected = true;
            starttilstand();
        }

        private void btnOpskrivBeholdning_Click(object sender, EventArgs e)
        {
            bool isInt;
            int antal;

            isInt = int.TryParse(txtAntal.Text, out antal);

            if (!isInt || antal < 0)
            {
                MessageBox.Show("Fejlindtastning, tast kun positive heltal", "Pokkers!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            lagersystem.OpskrivBeholdning(antal);
            opdaterProduktTextbokse(txtProduktNr.Text);
            txtAntal.Clear();
        }

        private void btnRediger_Click(object sender, EventArgs e)
        {
            redigertilstand();
        }

        private void btnLagerliste_Click(object sender, EventArgs e)
        {
            Form lagerRapport = new frmLagerRapport(lagersystem);
            this.Hide();
            lagerRapport.ShowDialog();
            this.Show();
        }

        private void btnSlet_Click(object sender, EventArgs e)
        {
            DialogResult sletresultat = MessageBox.Show("Er du sikker på at du vil slette valgte produkt?", "Vil du slette?", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2);

            if (sletresultat == DialogResult.Yes)
            {
                lagersystem.SletProdukt();
                rydTextbokse();
                opdaterProduktliste();
            }
        }

        private void btnProduktStatistik_Click(object sender, EventArgs e)
        {
            Form produktstatistik = new frmProduktStatisik(lagersystem);
            this.Hide();
            produktstatistik.ShowDialog();
            this.Show();
        }

        //Private metoder
        private void opdaterProduktTextbokse(string produktNr)
        {
            IProduktdata produktdata = lagersystem.FindProdukt(produktNr);

            txtProduktNr.Text = produktdata.ProduktNr;
            txtBetegnelse.Text = produktdata.Betegnelse;
            txtPakkepris.Text = produktdata.PakkePris.ToString();
            txtStkPrPakke.Text = produktdata.StkPrPakke.ToString();
            txtBeholdning.Text = produktdata.Beholdning.ToString();
            txtMinimumsbeholdning.Text = produktdata.MinimumBeholdning.ToString();

            ILeverandørdata leverandørdata = lagersystem.FindLeverandør(produktdata.LeverandørId);
            cboLeverandør.SelectedItem = leverandørdata.LeverandørId + ": " + leverandørdata.Navn;
        }

        private void opdaterProduktliste()
        {
            IEnumerator produktiterator = lagersystem.GetProduktIterator();
            produktiterator.Reset();

            lstProdukter.Items.Clear();

            while (produktiterator.MoveNext())
            {
                IProduktdata produktdata = (IProduktdata)produktiterator.Current;
                ListViewItem linie = new ListViewItem();
                linie.Text = produktdata.ProduktNr.ToString();
                linie.SubItems.Add(produktdata.Betegnelse);
                lstProdukter.Items.Add(linie);
            }
        }
      
        private void rydTextbokse()
        {
            txtBeholdning.Clear();
            txtBetegnelse.Clear();
            txtPakkepris.Clear();
            txtProduktNr.Clear();
            txtStkPrPakke.Clear();
            txtMinimumsbeholdning.Clear();
            cboLeverandør.SelectedIndex = -1;
        }
        
        //Tilstandstyringer
        private void starttilstand()
        {
            tilstand = STARTTILSTAND;

            btnNy.Enabled = true;
            btnRediger.Enabled = false;
            btnGem.Enabled = false;
            btnFortryd.Enabled = false;
            btnTilbage.Enabled = true;
            btnOpskrivBeholdning.Enabled = false;
            btnLagerliste.Enabled = true;
            btnProduktStatistik.Enabled = true;
            btnSlet.Enabled = false;

            txtBeholdning.Enabled = false;
            txtBetegnelse.Enabled = false;
            txtPakkepris.Enabled = false;
            txtProduktNr.Enabled = false;
            txtStkPrPakke.Enabled = false;
            txtMinimumsbeholdning.Enabled = false;
            txtAntal.Enabled = false;
            txtScan1.Enabled = true;

            cboLeverandør.Enabled = false;

            btnTilbage.Enabled = true;
            lstProdukter.Enabled = true;
            btnFind.Enabled = true;
        }

        private void oprettilstand()
        {
            tilstand = OPRETTILSTAND;

            btnNy.Enabled = false;
            btnRediger.Enabled = false;
            btnGem.Enabled = true;
            btnFortryd.Enabled = true;
            btnTilbage.Enabled = false;
            btnOpskrivBeholdning.Enabled = false;
            btnLagerliste.Enabled = false;
            btnProduktStatistik.Enabled = false;
            btnSlet.Enabled = false;

            txtBeholdning.Enabled = true;
            txtBetegnelse.Enabled = true;
            txtPakkepris.Enabled = true;
            txtProduktNr.Enabled = true;
            txtStkPrPakke.Enabled = true;
            txtMinimumsbeholdning.Enabled = true;
            txtAntal.Enabled = false;
            txtScan1.Enabled = false;

            cboLeverandør.Enabled = true;

            btnTilbage.Enabled = false;
            lstProdukter.Enabled = false;
            btnFind.Enabled = false;
        }

        private void normaltilstand()
        {
            tilstand = NORMALTILSTAND;

            btnNy.Enabled = true;
            btnRediger.Enabled = true;
            btnGem.Enabled = false;
            btnFortryd.Enabled = false;
            btnTilbage.Enabled = true;
            btnOpskrivBeholdning.Enabled = true;
            btnLagerliste.Enabled = true;
            btnProduktStatistik.Enabled = true;
            btnSlet.Enabled = true;

            txtBeholdning.Enabled = false;
            //txtBeholdning.ReadOnly = true;          
            txtBetegnelse.Enabled = false;
            txtPakkepris.Enabled = false;
            txtProduktNr.Enabled = false;
            txtStkPrPakke.Enabled = false;
            txtMinimumsbeholdning.Enabled = false;
            txtAntal.Enabled = true;
            txtScan1.Enabled = true;

            cboLeverandør.Enabled = false;

            btnTilbage.Enabled = true;
            lstProdukter.Enabled = true;
            btnFind.Enabled = true;
        }

        private void redigertilstand()
        {
            tilstand = REDIGERTILSTAND;

            btnNy.Enabled = false;
            btnRediger.Enabled = false;
            btnGem.Enabled = true;
            btnFortryd.Enabled = true;
            btnTilbage.Enabled = false;
            btnOpskrivBeholdning.Enabled = false;
            btnLagerliste.Enabled = false;
            btnProduktStatistik.Enabled = false;
            btnSlet.Enabled = false;

            txtBeholdning.Enabled = true;
            txtBetegnelse.Enabled = true;
            txtPakkepris.Enabled = true;
            txtProduktNr.Enabled = false;
            txtStkPrPakke.Enabled = true;
            txtMinimumsbeholdning.Enabled = true;
            txtAntal.Enabled = false;
            txtScan1.Enabled = false;

            cboLeverandør.Enabled = true;

            btnTilbage.Enabled = false;
            lstProdukter.Enabled = false;
            btnFind.Enabled = false;
        }
    }
}
